package edu.seu.mart.utils;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import edu.seu.mart.model.Article;
import edu.seu.mart.model.TulingMap;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 图灵API返回JSON数据处理类
 */
public class TulingKit {

    /**
     * 返回码类型：
     *
     * 100000 文本类数据
     * 200000 网址类数据
     * 302000 新闻
     * 304000 应用、软件、下载
     * 305000 列车
     * 306000 航班
     * 308000 电影、菜谱、视频、小说
     * 309000 酒店
     * 311000 价格
     * 40001 key的长度错误（32位）
     * 40002 请求内容为空
     * 40003 key错误或账号未激活
     * 40004 当天请求次数已用完
     * 40005 暂不支持该功能
     * 40006 服务器升级中
     * 40007 服务器数据格式异常
     */

    /**
     * 返回普通文本消息
     */
    public static String respText(JSONObject object, String code) {
        StringBuilder sb = new StringBuilder();
        sb.append(object.getString("text"));
        // 普通文本消息
        if (!"100000".equals(code)) {
            // 链接类消息
            if ("200000".equals(code)) {
                sb.append("\n链接：").append(object.getString("url"));

            } else {
                // 其他消息会返回多条结果，默认只回复第一条结果
                JSONArray array = object.getJSONArray("list");
                JSONObject list = array.getJSONObject(0);
                if ("304000".equals(code)) {
                    // 软件应用下载
                    sb = show(sb, list, TulingMap.softwareMap);
                } else if ("306000".equals(code)) {
                    // 航班
                    sb = show(sb, list, TulingMap.flightMap);
                } else if ("308000".equals(code)) {
                    // 电影、菜谱、视频、小说
                    sb = show(sb, list, TulingMap.movieMap);
                } else if ("309000".equals(code)) {
                    // 酒店
                    sb = show(sb, list, TulingMap.hotelMap);
                } else if ("311000".equals(code)) {
                    // 价格
                    sb = show(sb, list, TulingMap.priceMap);
                }
            }
        }
        return sb.toString();
    }

    /**
     * 返回图文消息
     */
    public static List<Article> respNews(JSONObject object, String code) {
        List<Article> articles = new ArrayList<>();
        JSONArray array = object.getJSONArray("list");
        int size = array.size();
        int count = size < 5 ? size : 5;
        // 新闻
        if ("302000".equals(code)) {
            for (int i = 0; i < count; i ++) {
                JSONObject list = array.getJSONObject(i);
                Article article = new Article();
                article.setTitle(list.getString("article"));
                article.setDescription("");
                article.setPicUrl(list.getString("icon"));
                article.setUrl(list.getString("detailurl"));
                articles.add(article);
            }
        } else if ("305000".equals(code)) {
            // 列车
            Article first = new Article();
            first.setTitle(object.getString("text"));
            first.setDescription("");
            first.setPicUrl("");
            first.setUrl("");
            articles.add(first);
            for (int i = 0; i < count - 1; i ++) {
                JSONObject list = array.getJSONObject(i);
                Article article = new Article();
                article.setTitle(list.getString("start") + " - " + list.getString("terminal"));
                article.setDescription(list.getString("trainnum") + "  "
                        + list.getString("starttime") + ", " + list.getString("endtime"));
                article.setPicUrl(list.getString("icon"));
                article.setUrl(list.getString("detailurl"));
                articles.add(article);
            }
        }
        return articles;
    }

    public static StringBuilder show(StringBuilder sb, JSONObject list, Map<String, String> map) {
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String value = entry.getValue();
            if (value != null) {
                sb.append("\n").append(entry.getKey()).append("：").append(list.getString(value));
            }
        }
        return sb;
    }
}
